import store from '@/store'
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
// 重写push 紧跟注册路由下书写 生效了
const originPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location) {
    return originPush.call(this, location).catch(err => err)
}
// 将路由规则拆分 模块化
import routes from './routes'
const router = new VueRouter({
    mode:'hash',
    routes,
    scrollBehavior() {
        // 始终滚动到顶部
        return { y: 0 }
    },
})
// 全局守卫 【前置】
router.beforeEach(async (to, from, next) => {
    // 获取仓库中的token
    let token = store.state.user.token
    // 获取仓库中的用户信息
    let nicKname = store.state.user.nickName
    //  如果token为真 代表用户已登录
    if (token) {
        // 用户已登录的话 首先不可切换至login组件
        if (to.path == '/login') {
            next('/')
        } else {//登陆成功 且切换的是非login路由组件
            //  路由切换前如用户信息为真 则直接放行
            // 注意：登陆成功后响应回来的数据中包含nickName(也就是说只要用户不手动刷新 vuex中用户数据就不会丢失 则else就不会执行重新获取 目的路由展示的用户信息也不会丢失.仓库里有嘛可以捞到)
            if (nicKname) {
                next()
            } else {
                // 如没有用户信息则重新派发对应请求（用户手动刷新页面,导致vuex用户数据丢失,目的路由捞不到数据。所以在进入到目的路由之前重新派发了请求,仓库中不就有了,目的路由不就又可以捞到数据了）,并捕获请求状态
                try {
                    await store.dispatch('getUserInfo')
                    // 任务成功后则放行
                    next()
                } catch (error) {
                    // 用户已登录且也发了获取用户信息请求 还是获取用户信息失败了 只有一种可能就是token过期了
                    // 解决方案：移除仓库中的用户信息、token及本地token(该功能仓库中有直接使用即可) 在放行至login路由组件 以便用户重新登录。
                    await store.dispatch('getloginOut')//这里之所以没有捕获成功与失败是因为已经有一个trycatch了再来一个太恶心了，直接跳算了 反正影响不是很大
                    next('/login')
                    console.log(5);

                }
            }
        }

    } else {
        // 未登录不可切换至【交易、支付、支付成功、提交订单页、个人订单页】
        let topath = to.path
        // 不等于-1即代表topath中包含未登录不可去的组件 
        if (topath.indexOf('/pay') != -1 || topath.indexOf('/trade') != -1 || topath.indexOf('/center') != -1) {
            // 不合法转至登陆页 让用户进行登陆 //并通过query参数携带上用户本想去的组件,登陆成功后直接跳转用户想去的地方 增强用户体验
            next(`/login?redirect=${topath}`)
        } else {
            next()
        }
    }
})
export default router